home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork2.lzh
/
サンプル基礎編
/
ファイル操作
/
FLDITEM.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
8KB
|
232 lines
/******************************************************************************
* flditem.c: ダイアログの処理関数
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <console.h> /* コンソール系マネージャを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <text.h> /* テキストマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "file.h" /* このプログラム固有のヘッダファイル */
static int dlgMode; /* ダイアログ処理モード */
static short funcKeyTbl[] = { /* ファンクションキーアサインテーブル */
K_HOME, 0, /* [HOME] */
K_DEL, 0x07, /* [DEL] */
K_RUP, 0x03, /* [ROLL UP] */
K_RDOWN, 0x12, /* [ROLL DOWN] */
K_UNDO, 0, /* [UNDO] */
K_LEFT, 0x13, /* [←] */
K_UP, 0x05, /* [↑] */
K_RIGHT, 0x04, /* [→] */
K_DOWN, 0x18, /* [↓] */
K_CLR, 0, /* [CLR] */
K_HELP, 0, /* [HELP] */
K_INS, 0, /* [INS] */
0, 0 /* テーブル終端 */
};
/******************************************************************************
* dialogProc(): ダイアログの作成、表示と各種処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* DlgPrm *pdp ダイアログ処理用パラメータへのポインタ
* 戻り値: int num 終了したダイアログアイテムの番号
* = 1: [実行]ボタン
* = 2: [取消]ボタン
* < 0: 処理失敗
*/
int dialogProc(ComVal *pcv, DlgPrm *pdp)
{
int num; /* ダイアログのアイテム番号 */
int lastBC;
Rect rc;
Handle dIListHdl;
Graph *lastGraph;
Dialog dialog; /* ダイアログレコード */
Dialog *dialogPtr = &dialog; /* ダイアログポインタ(疑似ポインタ)*/
static Rect dlgPos[2] = { /* ダイアログの表示位置 */
/* 入力欄が1つ */
{ DLG1_X, DLG1_Y, DLG1_X + DLG1_H, DLG1_Y + DLG1_V },
/* 入力欄が2つ */
{ DLG2_X, DLG2_Y, DLG2_X + DLG2_H, DLG2_Y + DLG2_V }
};
/* ダイアログアイテムのリソースを読み込む */
dIListHdl = TSRscGet('DITL', pdp->mode + 127);
if (dIListHdl == NULL) {
pcv->errorCode = 14; /* 読み込めなかった */
return -1; /* 失敗したので-1を返す */
}
/* ダイアログの表示位置を補正する */
TSAdjustRect(&rc, &dlgPos[pdp->mode - 1], 16);
dialogPtr = DMOpen( /* ダイアログをオープンする */
dialogPtr, /* 用意したダイアログポインタ */
&rc, /* ダイアログの表示位置 */
NONTITLE, /* タイトルは自分で描画する */
FALSE, /* オープン時に描画しない */
WI_DLG << 4, /* ダイアログウィンドウ */
W_FRONT, /* 一番手前に表示する */
FALSE, /* クローズボタンを使用しない */
LONGWORD(1, TSGetID()), /* 自分のタスクID */
dIListHdl); /* アイテムリストへのハンドル */
if (dialogPtr == NULL) {
pcv->errorCode = 7; /* 作成できなかった */
return -1; /* 失敗したので-1を返す */
}
/* ファンクションキーアサインテーブルを設定する */
(*dialogPtr->tEdit)->funcCode = funcKeyTbl;
/* 編集可能テキストの文字列をクリアする */
setDItemText(dialogPtr, 3, NONTITLE);
if (pdp->mode == 2)
setDItemText(dialogPtr, 4, NONTITLE);
WMShow(&dialogPtr->window); /* ダイアログを表示する */
/* ダイアログをカレントグラフにする */
lastGraph = GMExgGraph(&dialogPtr->window.graph);
/* タイトルを描画する */
GMShadowStrZ(pdp->title, LONGWORD((DLG1_H - pdp->len * 6) / 2, 4));
GMShadowStrZ(pdp->str1, LONGWORD(16, 28));
if (pdp->mode == 2)
GMShadowStrZ(pdp->str2, LONGWORD(16, 76));
lastBC = GMBackColor(G_WHITE); /* バックグラウンドカラーを白にする */
DMDraw(dialogPtr); /* すべてのアイテムを描画する */
dlgMode = pdp->mode; /* ダイアログ処理モードを設定する */
while (1) {
/* 帰還属性を持つアイテムが押されるまで、アイテムの各種処理を
システムに任せて、押されたアイテムの番号を取得する */
num = DMControl(filterProc);
if (num == 1) {
/* [実行]ボタンの処理 */
/* 編集可能テキスト1の文字列を取得する */
getDItemText(dialogPtr, 3, pdp->src);
if (pdp->mode == 2)
/* 編集可能テキスト2の文字列を取得する */
getDItemText(dialogPtr, 4, pdp->dst);
break;
} else if (num == 2)
/* [取消]ボタンの処理 */
break;
}
GMBackColor(lastBC); /* バックグラウンドカラーを元に戻す */
DMClose(dialogPtr); /* ダイアログをクローズする */
GMSetGraph(lastGraph); /* カレントグラフを元に戻す */
/* 処理が完了したのでアイテム番号を返す */
return num;
}
/******************************************************************************
* filterProc(): ダイアログのフィルタ関数
******************************************************************************
* 引数: Dialog *dlgPtr ダイアログポインタ
* Event *pev イベントレコードへのポインタ
* 戻り値: int 終了コード(ここでは、常に0)
* 注釈:
* DMControlから呼び出され、カーソルの点滅処理と、リターンキー/ESCキーの
* 入力を[設定]/[取消]ボタンのマウス左ダウンイベントに変換する処理を行う。
*/
int filterProc(Dialog *dlgPtr, Event *pev)
{
int keyCode; /* キーコード */
int num = 0; /* ダイアログのアイテム番号 */
short type;
Rect rc, rc1, rc2;
Handle item;
/* ダイアログをカレントグラフにする */
GMSetGraph(&dlgPtr->window.graph);
DIGet(dlgPtr, 3, &type, &item, &rc1);
if (dlgMode == 2)
DIGet(dlgPtr, 4, &type, &item, &rc2);
switch (pev->what) { /* イベントの種類は? */
case E_IDLE: /* アイドルイベント */
TMIdle(dlgPtr->tEdit); /* カーソルを点滅させる */
break;
case E_KEYDOWN: /* キーダウンイベント */
/* キーコードをファンクションキーアサインテーブルで変換する */
keyCode = TMKeyToAsk(dlgPtr->tEdit, (TsEvent *) pev);
/* キーコードがあるか? */
if (keyCode != -1 && keyCode != 0) {
switch (pev->whom.key.ascii) {
case '\r': /* リターンキーかENTERキー */
if ((*dlgPtr->tEdit)->view.l.l_t == rc1.l.l_t)
/* ダイアログ処理モードが2の場合、
次の編集テキストへ移る */
num = (dlgMode == 2) ? 4 : 1;
else if (dlgMode == 2
&& (*dlgPtr->tEdit)->view.l.l_t == rc2.l.l_t)
num = 1; /* [実行]ボタン */
break;
case '\x1b': /* ESCキー */
num = 2; /* [取消]ボタン */
break;
}
if (num != 0) {
/* 指定アイテムのレクタングル内を指す座標を
作成する */
DIGet(dlgPtr, num, &type, &item, &rc);
/* 縦横4ドットだけ内側へ移動する */
rc.d.left += 4;
rc.d.top += 4;
/* グローバル座標系に変換する */
pev->where.x_y = GMLocalToGlobal(rc.l.l_t);
/* イベントをマウス左ダウンイベントにする */
pev->what = E_MSLDOWN;
}
}
break;
case E_UPDATE: /* アップデートイベント */
/* カーソルを点滅させるために、アップデート処理を行う */
WMUpdate(&dlgPtr->window); /* アップデートを開始する */
WMUpdtOver(&dlgPtr->window); /* アップデートを終了する */
break;
}
return 0;
}
/******************************************************************************
* setDItemText(): ダイアログアイテムの編集可能テキストへの文字列の設定
******************************************************************************
* 引数: Dialog *dlgPtr ダイアログポインタ
* int num ダイアログのアイテム番号
* _LASCII str 設定するLASCII型文字列
*/
void setDItemText(Dialog *dlgPtr, int num, _LASCII str)
{
short type;
Rect rc;
Handle item;
/* ダイアログアイテムのハンドルを取得する */
DIGet(dlgPtr, num, &type, &item, &rc);
DITSet(type, item, str); /* 編集可能テキストに文字列を設定する */
}
/******************************************************************************
* getDItemText(): ダイアログアイテムの編集可能テキストの文字列の取得
******************************************************************************
* 引数: Dialog *dlgPtr ダイアログポインタ
* int num ダイアログのアイテム番号
* _LASCII str LASCII型文字列を格納するポインタ
*/
void getDItemText(Dialog *dlgPtr, int num, _LASCII str)
{
short type;
Rect rc;
Handle item;
/* ダイアログアイテムのハンドルを取得する */
DIGet(dlgPtr, num, &type, &item, &rc);
DITGet(type, item, str); /* 編集可能テキストの文字列を取得する */
str[str[0] + 1] = 0; /* 文字列の最後に0を付加する */
}